package com.cskaoyan.java._1handle._3throw;

/**
 * throw关键字和throws关键字完全不同,使用的场景不同,语义也完全不同
 * throws关键字写在方法声明的列表中,它表示该方法抛出异常的可能性,可以表示抛出多个
 * 现在,我们的需求是,确定的,肯定的,在方法内部抛出一个异常,那怎么办?
 * 使用throw关键字
 * 它的语法是:
 * (一般写在方法体中) throw + 异常对象
 *
 * 异常对象可以通过异常类的构造器,new对象得来!
 * 大多数Java异常类,都有两个构造器:
 *      1.无参构造器
 *      2.带String参数的构造器,其中这个String参数表示异常产生的原因
 *
 * 语法解释:
 *      1.该语法必须在一个方法中使用，不能直接写在类体中，也不能写在构造/静态代码块中。
 *      2.该语法表示，当执行到该行代码时，一定的、确定的抛出一个异常对象。
 *      3.语法中的异常对象，一般使用"new"关键字创建相应的异常对象。
 *          异常类的构造方法普遍都可以传入一个字符串，表示对异常产生（原因）的说明。
 *
 * 注意事项:
 *      1.既然throw明确抛出了异常对象, 那么就不要try...catch捕获异常,而是应该将异常抛出去
 *          如果这个异常是运行时异常,因为运行时异常会自动向上抛出,所以运行时异常throw后不用做任何处理,就会自己抛出给方法的调用者
 *          如果这个异常是编译时异常,就必须配合throws关键字将它手动抛给方法的调用者(因为编译时异常不会自动抛出)
 *
 *      2.在方法当中,throw关键字的使用,会导致该行代码后面都不会继续执行了
 *          所以它的作用,在方法内部和return是一致的 用来表示结束方法
 *
 * @since 16:28
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*try {
            System.out.println(10 / 0);
        } catch (Exception e) {
            throw e;
        }
        System.out.println("hello");*/
        // test();

        try {
            test2();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

    public static void test() {
        // int[] arr = null;
        // System.out.println(arr.length);
        throw new NullPointerException("我就是让你空指针异常!");
        // Unreachable statement
        // System.out.println();
    }

    public static void test2() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("我抛出了一个编译时异常!");
    }
}
